import store from 'store2';

export const GLOBAL_NAMESPACE = 'mars';

/**
 * 基于 store2，使用 localStorage 和 sessionStorage 持久化保存数据。
 * 本项目仅使用 localStorage。
 */

/**
 * 获取数据
 * @param namespace - 命名空间
 * @param key - 键值
 * @param alt - 获取失败时，默认返回值
 * @returns
 */
export function get<T>(name: string, key: string, alt?: T): T | undefined {
  const namespace = name || GLOBAL_NAMESPACE;
  const temp = namespace ? store.namespace(namespace) : store;
  return temp.get(key, alt) || sessionStorage.getItem(`${namespace}.${key}`);
}

/**
 * 保存数据
 * @param namespace - 命名空间
 * @param key - 键值
 * @param value - 要保存的数据
 */
export function set<T>(name: string, key: string, value: T, isSession?: boolean) {
  const namespace = name || GLOBAL_NAMESPACE;
  const temp = namespace ? store.namespace(namespace) : store;
  if (isSession) {
    return sessionStorage.setItem(`${namespace}.${key}`, JSON.stringify(value));
  }
  return temp.set(key, value);
}

/**
 * 删除数据
 * @param namespace
 * @param key
 */
export function remove(name: string, key: string) {
  const namespace = name || GLOBAL_NAMESPACE;
  const temp = namespace ? store.namespace(namespace) : store;
  sessionStorage.removeItem(`${namespace}.${key}`);
  return temp.remove(key);
}

/**
 * 清除数据
 * @param namespace
 */
export function clear(name: string) {
  const namespace = name || GLOBAL_NAMESPACE;
  const temp = namespace ? store.namespace(namespace) : store;
  temp.clear();
}

export default {
  get,
  set,
  remove,
  clear,
};
